#include <iostream>
#include <vector>
#include <map>

using namespace std;

// 分 a+b 和 c+d 两个map来求解 分别遍历 a,b 和 c,d
// 在遍历 c,d 时找到和为 0 时 计数
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
    int result {};
    map<int, int> sumMap {}; // map value 默认为0 可以不用判断是否存在再进行操作
    for (int i = 0, len1 = nums1.size(); i < len1; i++) {
        for (int j = 0, len2 = nums2.size(); j < len2; j++) {
            int sum = nums1[i] + nums2[j];
            // if (sumMap.count(sum) > 0) {
            //     sumMap[sum] += 1;
            // } else {
            //     sumMap[sum] = 1;
            // }

            // 问：下面这行和上面不等价？
            // 答：这是后缀自增，运算后才进行 ++ 这里应该使用前缀自增
            // sumMap[sum] = sumMap.count(sum) > 0 ? sumMap[sum]++ : 1;

            sumMap[sum]++;
        }
    }

    for (int i = 0, len1 = nums3.size(); i < len1; i++) {
        for (int j = 0, len2 = nums4.size(); j < len2; j++) {
            int sum = nums3[i] + nums4[j];
            if (sumMap.count(-sum) > 0) {
                result += sumMap[-sum];
            }
        }
    }

    return result;
}

void printVector(vector<int>& nums) {
    for (int i = 0, len = nums.size(); i < len; i++) {
        cout << "nums[" << i << "] = " << nums[i] << "\n";
    }
}

int main() {
    vector<int> nums1 { -1, -1 };
    vector<int> nums2 { -1, 1 };
    vector<int> nums3 { -1, 1 };
    vector<int> nums4 { 1, -1 };

    int result = fourSumCount(nums1, nums2, nums3, nums4);
    cout << "result: " << result << "\n";

    return 0;
}